
#define maxn  2030
int n,m;
/**********ac自动机模板*************************///poj 3691
const int zimu=4;//字母的个数
int cnt;
//zimu表示trie树上面的字母数,cnt表示trie的节点标号0到cnt
struct node
{
	int next[zimu], fail;
	int flag; //trie树上面的信息
	void init()
	{
		memset(next,0,sizeof(next));
		fail=-1; flag=0;//注意fail开始赋值为-1；
	}
}trie[maxn];
int inline tonum(char ch)//字母到数字的映射
{
	if(ch=='A')	return 0;
	if(ch=='T')	return 1;
	if(ch=='G')	return 2;
	if(ch=='C')	return 3;
}
void insert(char s[],int len)
{
	int i=0,now=0;
	while(i<len)
	{
		int t= tonum(s[i]);
		if(trie[now].next[t]==0)
		{
			trie[++cnt].init();
			trie[now].next[t]=cnt;
		}
		now= trie[now].next[t]; 
		i++;
	}
	trie[now].flag=1;
}


int q[maxn],head,tail;//注意以下队列的大小
void bfs()//建立fail
{
	int p,r,i,now;
	head=tail=q[0]=0;
	
	while(head<=tail)
	{
		now=q[head++];
		for(i=0; i<zimu; i++)
			if(trie[now].next[i])
			{
				p=trie[now].next[i];r=trie[now].fail;
				while(r!=-1 &&!trie[r].next[i])	r=trie[r].fail;
				if(r==-1)	trie[p].fail=0;
				else
				{
					trie[p].fail=trie[r].next[i];
					
					//这里对自动机的内容修改
					trie[p].flag|=trie[trie[p].fail].flag;
				}
				q[++tail]=p;
			}
			else
			{
				r=trie[now].fail;
				while(r!=-1 && !trie[r].next[i])r=trie[r].fail;
				if(r==-1)	trie[now].next[i]=0;
				else trie[now].next[i]=trie[r].next[i];
			}
	}
}
void init()//初始化0的trie的内容,cnt从0开始
{
	cnt=0;
	trie[0].init();
}
/***ac自动机模板,询问操作，询问ch是否在trie里面出现*********/
void query(int len,char ch[])//统计ch里面有的子串是否是trie树里面的串
{
	int i;
	int p=0,tp;
	for(i=0; i<len ; i++)
	{
			int now=tonum(ch[i]);
			while(trie[p].next[now]==0 && p)p=trie[p].fail;
			p=trie[p].next[now];
			tp=p;
			while(tp && trie[tp].flag<pcnt)
			{
				trie[tp].flag=pcnt;
				ans+=trie[tp].a;
				tp=trie[tp].fail;
			}
	}
}
/***ac自动机模板,询问操作，询问ch是否在trie里面出现*********/
/**********ac自动机模板*************************/
char s[maxn];
int dp[maxn][maxn];
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in","r",stdin);
#endif
    int i,j,k;
	int t;
	int cas=1;
	while(scanf("%d",&t),t)
	{	
/**********ac自动机模板*************************/
		init();
/**********ac自动机模板*************************/
		printf("Case %d: ", cas++ );
		for(i=0; i<t; i++)
		{
			scanf("%s",s);
/**********ac自动机模板*************************/
			insert(s,strlen(s));
/**********ac自动机模板*************************/
		}	
/**********ac自动机模板*************************/
		bfs();
/**********ac自动机模板*************************/
		scanf("%s",s);
		int len=strlen(s);
		
		for(i=0; i<=len ; i++)
		for(j=0; j<=cnt; j++)
		{
			dp[i][j]=inf;
		}
		dp[0][0]=0;
		for(i=1; i<=len ; i++)
		{
			int a=tonum(s[i-1]);
		for(j=0; j<=cnt; j++)
		if(dp[i-1][j]!=inf && trie[j].flag!=1)
		{
			for(k=0; k<4; k++)
			if(trie[trie[j].next[k]].flag!=1)
			{
		dp[i][trie[j].next[k]]=min(dp[i][trie[j].next[k]],dp[i-1][j]+(k!=a))		;
			}
		}
		}
		int ans=inf;
		for(j=0; j<=cnt; j++)
			ans=min(ans,dp[len][j]);
		if(ans==inf)	
		ans=-1;
		printf("%d\n",ans);
	}
}

